package com.tedu.day02.oop;

/**
 * 抽象类的特点【基本概念】<补充>
 *             类：成员变量/成员方法/构造方法
 *             抽象类：成员变量/成员方法/构造方法
 *             创建抽象类---普通类变成（实现）子类---继承抽象类
 *             成员变量：既可以是变量，也可以是常量
 *             构造方法：有，用与子类访问调用抽象【父】类的成员变量----赋值
 *             构造方法：既可以是抽象的，也可以是非抽象的
 *             抽象方法与非抽象方法出现在抽像类问题：
 *             A：抽象方法   【重写】强制要求子类完成父类抽象方法
 *             B：非抽象方法  【拓展】子类继承的事情，提高代码复用性
 */

abstract class Foo{
    //成员变量
    public int i=10;
    public final int J=20;  //成员变量：常量
    //Java强类型语言：大小写分明
    //public int j=30;
    //构造方法

    public Foo() {
        this(30);  //调用当前类的对象的构造器
    }

    public Foo(int i) {
        this.i = i;
    }
    //成员方法:抽象方法
    public abstract void show();
    //成员方法:非抽象方法
    public void method(){
        System.out.println("Foo     method");
    }
}

//实现  子类
class Goo extends Foo{

    public void show() {
        System.out.println("Goo   show");
    }
//    public void method(){
//        System.out.println("Goo  method");
//    }
}


public class 抽象类补充知识点 {
    public static void main(String[] args) {
        //抽象类---继承----多态性-----向上造型
        Foo f=new Goo();
        //①实例化----子类的构造器，默认存在无参构造器，再通过super（）调用父类的无参构造器
        //②执行抽象类的无参构造器，发现有this（参数）调用其他有参数的构造器
        //③this调用的同时，完成对抽象类中 i 进行赋值  i=30
        System.out.println(f.i);  //④输出 i 的值  30
        //  f.J=40; 不可修改
        System.out.println(f.J);
        //------------------------------------------------------------------------------
        f.show();    //输出：Goo  show  重写
        f.method();  //输出：Foo  method  拓展【子类方法重写】
    }
}


/*拓展：abstract关键字共存问题*/
abstract class Aoo{
    //private abstract void show1();
    //public final abstract void show2();
    //public static abstract void show3();
    // 无意义：静态方法需要加语法快{}，抽象方法
}
